home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 8823 / 8823.xpi / chrome / omnibar / content / browserOverlay.js < prev    next >
Text File  |  2009-11-01  |  25KB  |  651 lines

  1. (function(){
  2. var
  3. Cc = Components.classes,
  4. Ci = Components.interfaces,
  5. Cu = Components.utils,
  6. kXULNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul",
  7. DNSSVC = Cc["@mozilla.org/network/dns-service;1"].getService(Ci.nsIDNSService),
  8. mainThread = Cc["@mozilla.org/thread-manager;1"].getService().mainThread,
  9. log = function(o) Cc["@mozilla.org/consoleservice;1"].getService(Ci.nsIConsoleService).logStringMessage(o+''),
  10. error = function(o) Cu.reportError(o+'');
  11.  
  12.  
  13. function checkHostname(hostName, callbackIfExists) {
  14.   DNSSVC.asyncResolve(hostName, 0, {
  15.     onLookupComplete: function (request, record, status) {
  16.       log("dns query resolved?" + status);
  17.     }
  18.   }, mainThread);
  19. }
  20.  
  21. var O = window.Omnibar = {
  22.   _imageElBox: null,
  23.   _imageEl: null,
  24.   _urlbar: null,
  25.   _rlPopup: null,
  26.   _prefs: null,
  27.   _init: function() {
  28.     // cache elements
  29.     O._rlPopup = document.getElementById("PopupAutoCompleteRichResult");
  30.     var textbox = O._urlbar = document.getElementById("urlbar");
  31.     O._imageElBox = document.getElementById("omnibar-defaultEngineBox");
  32.     O._imageEl = document.getElementById("omnibar-defaultEngine");
  33.  
  34.     // cache services..
  35.     O._prefSvc = Cc["@mozilla.org/preferences-service;1"]
  36.                     .getService(Ci.nsIPrefService);
  37.     
  38.     O._prefs = O._prefSvc.getBranch("extensions.omnibar.");
  39.     O._prefs.QueryInterface(Ci.nsIPrefBranch2).addObserver("", O, false);
  40.     O._ss = Cc['@mozilla.org/browser/search-service;1']
  41.                .getService(Ci.nsIBrowserSearchService);
  42.     
  43.     var localeService = Cc["@mozilla.org/intl/nslocaleservice;1"]
  44.                         .getService(Ci.nsILocaleService);
  45.     var stringBundleService = Cc["@mozilla.org/intl/stringbundle;1"]
  46.                               .getService(Ci.nsIStringBundleService);
  47.     O._sb = stringBundleService.createBundle(
  48.                 "chrome://omnibar/locale/strings.properties",
  49.                 localeService.getApplicationLocale());
  50.  
  51.     // do other init related stuff
  52.     if(!(O._defaultAutocompletesearch)) {
  53.       O._defaultAutocompletesearch = textbox.getAttribute('autocompletesearch');
  54.     }
  55.     
  56.     textbox.addEventListener("keydown", function(e) {
  57.       if(e.ctrlKey) {
  58.         switch (e.keyCode) {
  59.           case e.DOM_VK_DOWN:
  60.             O.changeEngine(1);
  61.             e.preventDefault();
  62.             break;
  63.           case e.DOM_VK_UP:
  64.             O.changeEngine(-1);
  65.             e.preventDefault();
  66.             break;
  67.           default:
  68.             break;
  69.         }
  70.       }
  71.     }, false)
  72.     textbox.addEventListener("DOMMouseScroll", function(e) {
  73.       if(e.ctrlKey) {
  74.         O.changeEngine(e.detail > 0 ? 1 : -1);
  75.         e.preventDefault();
  76.       }
  77.     }, false)
  78.     O._originalOnTextEnetered = O._urlbar.getAttribute("ontextentered");
  79.  
  80.     // add itself as an observer
  81.     var os = Cc["@mozilla.org/observer-service;1"]
  82.              .getService(Ci.nsIObserverService);
  83.     os.addObserver(O, "browser-search-engine-modified", false);
  84.  
  85.     if (window.onViewToolbarsPopupShowing) {
  86.       window.intercepted_onViewToolbarsPopupShowing = window.onViewToolbarsPopupShowing;
  87.       window.onViewToolbarsPopupShowing = function(event) {
  88.         O.onToolbarPopupShowing(event);
  89.       };
  90.     }
  91.  
  92.     if (window.openUILink) {
  93.       window.intercepted_openUILink = window.openUILink;
  94.       window.openUILink = function(url, e, ignoreButton, ignoreAlt, allowKeywordFixup, postData, referrerUrl) {
  95.         if(!O.handleSearchQuery(url, e)) {
  96.           var where = whereToOpenLink(e, ignoreButton, ignoreAlt);
  97.           openUILinkIn(url, where, allowKeywordFixup, postData, referrerUrl);
  98.         }
  99.       };
  100.     }
  101.   
  102.     // Need overrides for browser search to work even after search bar is hidden
  103.     var BS = window.BrowserSearch;
  104.     if(BS && BS.addEngine) {
  105.       BS.addEngine_backup = BS.addEngine;
  106.       BS.addEngine = function(engine, targetDoc) {
  107.             var browser = gBrowser.getBrowserForDocument(targetDoc);
  108.             // ignore search engines from subframes (see bug 479408)
  109.             if (!browser)
  110.               return;
  111.         
  112.             // Check to see whether we've already added an engine with this title
  113.             if (browser.engines) {
  114.               if (browser.engines.some(function (e) e.title == engine.title))
  115.                 return;
  116.             }
  117.         
  118.             // Append the URI and an appropriate title to the browser data.
  119.             // Use documentURIObject in the check for shouldLoadFavIcon so that we
  120.             // do the right thing with about:-style error pages.  Bug 453442
  121.             var iconURL = null;
  122.             if (gBrowser.shouldLoadFavIcon(targetDoc.documentURIObject))
  123.               iconURL = targetDoc.documentURIObject.prePath + "/favicon.ico";
  124.         
  125.             var hidden = false;
  126.             // If this engine (identified by title) is already in the list, add it
  127.             // to the list of hidden engines rather than to the main list.
  128.             // XXX This will need to be changed when engines are identified by URL;
  129.             // see bug 335102.
  130.             var searchService = Cc["@mozilla.org/browser/search-service;1"].
  131.                                 getService(Ci.nsIBrowserSearchService);
  132.             if (searchService.getEngineByName(engine.title))
  133.               hidden = true;
  134.         
  135.             var engines = (hidden ? browser.hiddenEngines : browser.engines) || [];
  136.         
  137.             engines.push({ uri: engine.href,
  138.                            title: engine.title,
  139.                            icon: iconURL });
  140.  
  141.         if (hidden)
  142.           browser.hiddenEngines = engines;
  143.         else {
  144.           browser.engines = engines;
  145.           if (browser == gBrowser.mCurrentBrowser) {
  146.             BS.updateSearchButton();
  147.           }
  148.         }
  149.       }
  150.       
  151.       BS.updateSearchButton_backup = BS.updateSearchButton;
  152.       BS.updateSearchButton = function() {
  153.         if(BS.searchBar) {
  154.           BS.updateSearchButton_backup();
  155.         }
  156.         var engines = gBrowser.mCurrentBrowser.engines,
  157.             box = document.getElementById("omnibar-in-urlbar");
  158.         if (engines && engines.length > 0) {
  159.           box.setAttribute("addengines", "true");
  160.         } else {
  161.           box.removeAttribute("addengines");
  162.         }
  163.       }
  164.       
  165.       BS.loadSearch_backup = BS.loadSearch;
  166.       BS.loadSearch = function(searchText, useNewTab) {
  167.         var ss = Cc["@mozilla.org/browser/search-service;1"].
  168.                  getService(Ci.nsIBrowserSearchService);
  169.         var engine = ss.currentEngine;
  170.         var submission = engine.getSubmission(searchText, null); // HTML response
  171.         if (!submission)
  172.           return;
  173.         if (useNewTab) {
  174.           gBrowser.loadOneTab(submission.uri.spec, null, null,
  175.                               submission.postData, null, false);
  176.         } else
  177.           loadURI(submission.uri.spec, null, submission.postData, false);
  178.       }
  179.       
  180.       //nsContextMenu.js
  181.       nsContextMenu.prototype.isTextSelection = function() {
  182.         var selectedText = getBrowserSelection(16);
  183.         if (!selectedText)
  184.           return false;
  185.     
  186.         if (selectedText.length > 15)
  187.           selectedText = selectedText.substr(0,15) + this.ellipsis;
  188.     
  189.         var ss = Cc["@mozilla.org/browser/search-service;1"].
  190.                  getService(Ci.nsIBrowserSearchService);
  191.         var engineName = ss.currentEngine.name;
  192.         
  193.         var menuLabel = gNavigatorBundle.getFormattedString("contextMenuSearchText",
  194.                                                             [engineName,
  195.                                                              selectedText]);
  196.         document.getElementById("context-searchselect").label = menuLabel;
  197.         try{
  198.           document.getElementById("context-searchselect").accessKey =
  199.                    gNavigatorBundle.getString("contextMenuSearchText.accesskey"); 
  200.         }catch(e){/*works only in 3.5+ versions*/}
  201.         return true;
  202.       }
  203.       
  204.       BS.webSearch = O.BS_webSearch;
  205.       
  206.     }
  207.     
  208.     if("organizeSE" in window) {
  209.       O.OSE.init();
  210.     }
  211.     
  212.     O.applyPrefs();
  213.   },
  214.   OSE: {
  215.     init: function() {
  216.       var e = document.getElementById('omnibar-osemenu');
  217.       e.setAttribute("ref", "urn:organize-search-engines:root");
  218.       e.setAttribute("datasources", "rdf:organized-internet-search-engines");
  219.       e.setAttribute("template", "searchbar-template");
  220.       e.setAttribute("sortDirection", "natural");
  221.       e.setAttribute("sortResource", "urn:organize-search-engines#Name");
  222.       e.builder.rebuild();
  223.       
  224.       var exts = {};
  225.       exts.omnibar = {
  226.         check: true,
  227.         sortDirectionHandler: function sortDirectionHandler(newVal) {
  228.           e.setAttribute("sortDirection", newVal);
  229.         },
  230.         wait: 0,
  231.         init: function() {
  232.           var e = document.getElementById('omnibar-osemenu');
  233.           e.addEventListener("popupshowing", this.onPopupShowing, true);
  234.           e.addEventListener("command", this.onCommand, true);
  235.         },
  236.         onCommand: function(e) {
  237.           var target = e.originalTarget, engine;
  238.           if(organizeSE.hasClass(target, "openintabs-item")) {
  239.             var folder = target.parentNode.parentNode.id;
  240.             folder = Cc["@mozilla.org/rdf/rdf-service;1"].getService(Ci.nsIRDFService)
  241.                        .GetResource(folder);
  242.             O._ss.currentEngine = organizeSE.SEOrganizer.folderToEngine(folder);
  243.           } else if(target.engine) {
  244.             O._ss.currentEngine = target.engine;
  245.           } else if(organizeSE.hasClass(target, "searchbar-engine-menuitem") ||
  246.                     organizeSE.hasClass(target, "addengine-item")) {
  247.             O._ss.currentEngine = organizeSE.SEOrganizer.getEngineByName(target.label);
  248.           }
  249.         },
  250.         onPopupHidden: function(e) {
  251.         },
  252.         onPopupShowing: function(e) {
  253.           if(e.target.parentNode == e.currentTarget) {
  254.             e.target.id = "omnibar-osemenu";
  255.           } else {
  256.             organizeSE.removeOpenInTabsItems(e.target);
  257.             //organizeSE.insertOpenInTabsItems(e.target); // not supported
  258.           }
  259.           e.stopPropagation();
  260.         }
  261.       };
  262.       
  263.       var initStr = organizeSE__Extensions.prototype.init.toString();
  264.       initStr = initStr.replace(/this\)/,'exts)');
  265.       eval('var initFn = ' + initStr);
  266.       initFn();
  267.     }
  268.   },
  269.   webSearch: function() {
  270.     var BS = BrowserSearch,
  271.         sb = BS.searchBar || (BS.getSearchBar ? BS.getSearchBar() : null);
  272.     if(sb && isElementVisible(sb)) BS.webSearch();
  273.     else openLocation();
  274.   },
  275.   BS_webSearch: function() {
  276.     if (window.fullScreen)
  277.       FullScreen.mouseoverToggle(true);
  278.  
  279.     var searchBar = BrowserSearch.searchBar;
  280.     if (isElementVisible(searchBar)) {
  281.       searchBar.select();
  282.       searchBar.focus();
  283.     } else openLocation();
  284.   },
  285.   observe: function(aEngine, aTopic, aVerb) {
  286.     O.applyPrefs();
  287.   },
  288.   _recheck: function() {
  289.     // check we still have the auto-complete options setup.
  290.     if(O._urlbar.getAttribute("autocompletesearch").indexOf("omnibar-") < 0) {
  291.       O._defaultAutocompletesearch = textbox.getAttribute('autocompletesearch');
  292.       O.enableSearchAutocomplete();
  293.     }
  294.   },
  295.   /**
  296.    * adds options to urlbar for omni-bar autocompletes.
  297.    */
  298.   enableSearchAutocomplete: function() {
  299.     // XXX it can be made pluggable so that a other kind of autocompletes could
  300.     // be used.
  301.     // TODO can we take some kind of preference option to choose what we want?
  302.     var textbox = O._urlbar;
  303.     var autocompletesearch;
  304.     if(O._prefs.getBoolPref('intellisense')) {
  305.       var existingAutocomplete = O._defaultAutocompletesearch.replace("history", "");
  306.       autocompletesearch = existingAutocomplete + " omnibar-allinone";
  307.     } else {
  308.       autocompletesearch = O._defaultAutocompletesearch + ' omnibar-search-suggestions';
  309.     }
  310.     textbox.setAttribute('autocompletesearch', autocompletesearch);
  311.   },
  312.   get engines() {
  313.     var engines = [];
  314.     O._ss.getEngines({}, []).forEach(function(e){
  315.       if(e.hidden !== true) {
  316.         engines.push(e);
  317.       }
  318.     });
  319.     return engines;
  320.   },
  321.   changeEngine: function(by) {
  322.     var ss = O._ss;
  323.     var engines = O.engines;
  324.     // TODO probably this does not work in a few cases. it would bbe prudent to
  325.     // calculate the index manually
  326.     //var idxCurr = engines.indexOf(ss.currentEngine);
  327.     var idxCurr = O.getEngineIndex(ss.currentEngine, engines);
  328.     if(idxCurr < 0) {
  329.       log("could not determine current engine's index!");
  330.     }
  331.     var newIdx = idxCurr + by;
  332.     if(newIdx >= 0 &&  newIdx < engines.length) {
  333.       ss.currentEngine = engines[newIdx];
  334.       O.setEngineIcon();
  335.     }
  336.   },
  337.   getEngineIndex: function(aEngine, allEngines) {
  338.     for(var i = 0; i < allEngines.length; i ++) {
  339.       if(allEngines[i].name == aEngine.name) {
  340.       return i;
  341.       }
  342.     }
  343.     return -1;
  344.   },
  345.   setEngineIcon: function() {
  346.     var ss = O._ss;
  347.     var engine = ss.currentEngine;
  348.     var iconURI = engine.iconURI;
  349.     if(iconURI) {
  350.       O._imageEl.setAttribute("src", iconURI.spec);
  351.     } else {
  352.       // if none is found, use the default magnifier icon
  353.       O._imageEl.setAttribute("src", "");
  354.     }
  355.     O._imageEl.setAttribute("tooltiptext",
  356.                                O._sb.GetStringFromName("TIP.Search") +
  357.                                " " + engine.name + "\n\n" +
  358.                                O._sb.GetStringFromName("TIP.OmnibarIcon"));
  359.     document.getElementById("omnibar-defaultEngineName").value = engine.name;
  360.   },
  361.   applyPrefs: function() {
  362.     var prefSvc = O._prefSvc;
  363.     var prefs = O._prefs;
  364.     O._urlbar.setAttribute("ontextentered", "Omnibar._handleURLBarCommand(param);");
  365.     O.setEngineIcon();
  366.     O.enableSearchAutocomplete();
  367.     var textbox = O._urlbar, prefs = O._prefs;
  368.     textbox.setAttribute("maxrows", prefs.getIntPref("numresults")+"");
  369.     prefSvc.setIntPref("browser.urlbar.maxRichResults",
  370.                        Math.max(prefs.getIntPref('numresults'), prefSvc.getIntPref('browser.urlbar.maxRichResults')));
  371.  
  372.  
  373.     var rlcls = O._rlPopup.getAttribute("class"),
  374.         rlcls_slim,
  375.         CLS = "omnibar-style-slim";
  376.     rlcls = rlcls.replace(CLS, "");
  377.     rlcls_slim = [rlcls, CLS].join(" ");
  378.  
  379.     var popupStyle = prefs.getCharPref("popupstyle");
  380.     // reset style
  381.     textbox.setAttribute("autocompletepopup", "PopupAutoCompleteRichResult");
  382.     O._rlPopup.setAttribute("class", rlcls);
  383.     // apply style
  384.     switch(popupStyle) {
  385.       case "SIMPLE":
  386.         textbox.setAttribute("autocompletepopup", "PopupAutoComplete");
  387.         break;
  388.       case "RICHSLIM":
  389.         O._rlPopup.setAttribute("class", rlcls_slim);
  390.         break;
  391.     }
  392.     
  393.     document.getElementById("omnibar-in-urlbar").
  394.     setAttribute("autohide", prefs.getBoolPref("autohideinurlbar") ? "yes" : "no");
  395.     document.getElementById("omnibar-in-urlbar").
  396.     setAttribute("showinurlbar", prefs.getBoolPref("showinurlbar") ? "yes" : "no");
  397.     document.getElementById("omnibar-defaultEngineName").
  398.     setAttribute("hide", prefs.getBoolPref("hideenginename") ? "yes" : "no");
  399.     document.getElementById("omnibar-defaultEngine").
  400.     setAttribute("hide", prefs.getBoolPref("hideengineicon") ? "yes" : "no");
  401.     if(BrowserSearch.searchBar) {
  402.       var tbItem = document.getElementById('search-container');
  403.       if(prefs.getBoolPref("hidesearchbar")) {
  404.         tbItem.setAttribute('class', tbItem.getAttribute('class') + ' om-hidden');
  405.       } else {
  406.         tbItem.setAttribute('class', tbItem.getAttribute('class').replace(' om-hidden', ''));
  407.       }
  408.     }
  409.   },
  410.   _handleURLBarCommand: function(event) {
  411.     if(event instanceof KeyEvent) {
  412.       if(event.ctrlKey || event.shiftKey || event.metaKey) {
  413.         O.handleOriginalUrlbarCommand(event);
  414.         return;
  415.       }
  416.     }
  417.     if(!O.handleSearchQuery(O._urlbar.value, event)) {
  418.     // no search was performed. go ahead with default handling
  419.       O.handleOriginalUrlbarCommand(event);
  420.     }
  421.   },
  422.   handleSearchQuery: function(url, event) {
  423.     try {
  424.       // this is needed to generally allow usage of components in javascript
  425.       netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
  426.       var utils = Cc['@ajitk.com/omnibar/queryparser;1']
  427.                             .getService().wrappedJSObject;
  428.       var kwdInfo = utils.getKeywordInfo(url.split(' ')[0]);
  429.       // a keyword was found leave it to default handling
  430.       // XXX should we check for %s in keyword spec?
  431.       if(kwdInfo) return false;
  432.       var query = utils.parseQuery(url);
  433.       if(query.length > 0 && query[1] && query[1].length > 0) {
  434.         var search_str = query[0];
  435.         var ngins = query[1];
  436.         // checkHostname()  // TODO
  437.         // open the first tab according to user's current behavior. e.g.
  438.         // alt+enter should open things in new tab.
  439.         var firstEngine = ngins.shift();
  440.         var submission = firstEngine.getSubmission(search_str, null);
  441.         if(submission.postData != null) {
  442.           if (event && event.altKey) {
  443.             gBrowser.loadOneTab(submission.uri.spec, null, null,
  444.                                 submission.postData, false, true);
  445.             event.preventDefault();
  446.             event.stopPropagation();
  447.           } else {
  448.             openUILinkIn(submission.uri.spec,
  449.                        whereToOpenLink(event),
  450.                        null,
  451.                        submission.postData);
  452.           }
  453.         } else if(event instanceof KeyEvent) {
  454.           O._urlbar.value = submission.uri.spec;
  455.           O.handleOriginalUrlbarCommand(event);
  456.         } else {
  457.           openUILinkIn(submission.uri.spec,
  458.                      whereToOpenLink(event),
  459.                      null,
  460.                      submission.postData);
  461.         }
  462.         
  463.         ngins.forEach(function(e, i, arrey) {
  464.           var submission = e.getSubmission(search_str, null);
  465.           openUILinkIn(submission.uri.spec,
  466.                      "tabshifted",
  467.                      null,
  468.                      submission.postData);
  469.         });
  470.         if(ngins.length >= 1) {
  471.           var prefSvc = Cc["@mozilla.org/preferences-service;1"].
  472.                         getService(Ci.nsIPrefService);
  473.           var branch = prefSvc.getBranch("extensions.omnibar.");
  474.           var names = firstEngine.name;
  475.           ngins.forEach(function(n){
  476.             names += "," + n.name
  477.           });
  478.           branch.setCharPref("multiengines", names);
  479.         }
  480.         // everything finished as expected. return now.
  481.         return true;
  482.       }
  483.     }catch(e){
  484.       log(e);
  485.     }
  486.     return false;
  487.   },
  488.   handleOriginalUrlbarCommand: function(e) {
  489.     if(typeof handleURLBarCommand == "function") {
  490.       handleURLBarCommand(e);
  491.     } else {
  492.       // ff 3.1+
  493.       var fn = new Function('event', 'param', O._originalOnTextEnetered);
  494.       fn.call(O._urlbar, e, e);
  495.     }
  496.   },
  497.   onButtonClick: function (event) {
  498.     if(event.button == 0) {
  499.       document.getElementById('omnibar-engine-menu').openPopup(O._imageElBox, "after_end", -1, -1);
  500.             event.preventDefault();
  501.             event.stopPropagation();
  502.     }
  503.   },
  504.   onContextPopupShowing: function(event) {try{
  505.     var popup = document.getElementById("omnibar-engine-menu");
  506.     document.getElementById("omnibar-context-menuitem-suggestenabled")
  507.     .setAttribute("checked", O._prefSvc.getBoolPref("browser.search.suggest.enabled"));
  508.     
  509.     
  510.     if('organizeSE' in window) {
  511.       document.getElementById('omnibar-osemenu').removeAttribute('hidden');
  512.     } else {
  513.       // reference browser/search/search.xml
  514.       // Clear the popup, down to the first separator
  515.       while (popup.firstChild &&
  516.          popup.firstChild.className != "engines-separator") {
  517.         popup.removeChild(popup.firstChild);
  518.       }
  519.  
  520.       var ss = O._ss;
  521.       var currentEngine = ss.currentEngine;
  522.       var engines = O.engines;
  523.       for (var i = engines.length - 1; i >= 0; --i) {
  524.         var menuitem = document.createElementNS(kXULNS, "menuitem");
  525.         var name = engines[i].name;
  526.         menuitem.setAttribute("label", name);
  527.         menuitem.setAttribute("id", name);
  528.         menuitem.setAttribute("class", "menuitem-iconic omnibar-engine-menuitem");
  529.         if (engines[i] == currentEngine) {
  530.           menuitem.setAttribute("selected", "true");
  531.         }
  532.         if (engines[i].iconURI) {
  533.           menuitem.setAttribute("src", engines[i].iconURI.spec);
  534.         }
  535.         popup.insertBefore(menuitem, popup.firstChild);
  536.         menuitem.engine = engines[i];
  537.       }
  538.     }
  539.     
  540.     var items = popup.childNodes;
  541.     for (var i = items.length - 1; i >= 0; i--) {
  542.       if (items[i].getAttribute("class").indexOf("addengine-") != -1)
  543.         popup.removeChild(items[i]);
  544.     }
  545.  
  546.     // Add engines.
  547.     var addengines = gBrowser.mCurrentBrowser.engines;
  548.     if (addengines && addengines.length > 0) {
  549.       // Find the (first) separator in the remaining menu, or the first item
  550.       // if no separators are present.
  551.       var insertLocation = popup.firstChild;
  552.       while (insertLocation.nextSibling &&
  553.              insertLocation.localName != "menuseparator") {
  554.         insertLocation = insertLocation.nextSibling;
  555.       }
  556.       if (insertLocation.localName != "menuseparator")
  557.         insertLocation = popup.firstChild;
  558.       
  559.       var separator = document.createElementNS(kXULNS, "menuseparator");
  560.       separator.setAttribute("class", "addengine-separator");
  561.       popup.insertBefore(separator, insertLocation);
  562.       
  563.       // add new engines
  564.       for (var i = 0; i < addengines.length; i++) {
  565.         var menuitem = document.createElementNS(kXULNS, "menuitem");
  566.         var engineInfo = addengines[i];
  567.         var labelStr = 'Add "' + engineInfo.title + '"';
  568.         menuitem = document.createElementNS(kXULNS, "menuitem");
  569.         menuitem.setAttribute("class", "menuitem-iconic addengine-item");
  570.         menuitem.setAttribute("label", labelStr);
  571.         menuitem.setAttribute("tooltiptext", engineInfo.uri);
  572.         menuitem.setAttribute("uri", engineInfo.uri);
  573.         if(engineInfo.icon) menuitem.setAttribute("src", engineInfo.icon);
  574.         menuitem.setAttribute("title", engineInfo.title);
  575.         popup.insertBefore(menuitem, insertLocation);
  576.       }
  577.     }
  578.   }catch(e){alert(e)}},
  579.   onContextMenuClick: function(event) {
  580.     var prefs = O._prefSvc;
  581.     var item = event.originalTarget;
  582.     var cls = item.getAttribute("class");
  583.     if(cls.indexOf("addengine-item") >= 0) {
  584.       var type = Ci.nsISearchEngine.DATA_XML;
  585.       O._ss.addEngine(item.getAttribute("uri"), type,
  586.                          item.getAttribute("src"), false);
  587.     gBrowser.mCurrentBrowser.engines = [];
  588.     } else if(cls.indexOf("engine-menuitem") >= 0) {
  589.       if(item.engine) {
  590.         O._ss.currentEngine = item.engine;
  591.       }
  592.     } else if(cls.indexOf("suggest-option") >= 0) {
  593.       prefs.setBoolPref("browser.search.suggest.enabled",
  594.                         !prefs.getBoolPref("browser.search.suggest.enabled"));
  595.     }
  596.     O.applyPrefs();
  597.   },
  598.   openSearchEngineEditor: function() {
  599.     var wm = Cc["@mozilla.org/appshell/window-mediator;1"]
  600.                 .getService(Ci.nsIWindowMediator);
  601.  
  602.     var window = wm.getMostRecentWindow("Browser:SearchManager");
  603.     if (window) {
  604.       window.focus();
  605.     } else {
  606.       setTimeout(function () {
  607.         openDialog("chrome://browser/content/search/engineManager.xul",
  608.                    "_blank", "chrome,dialog,modal,centerscreen");
  609.       }, 0);
  610.     }
  611.   },
  612.   onToolbarPopupShowing: function(event) {
  613.     window.intercepted_onViewToolbarsPopupShowing(event);
  614.     try{
  615.       if(!O._toolbarPopupItem) {
  616.         var menuItem = O._toolbarPopupItem = document.createElement("menuitem");
  617.         menuItem.setAttribute("type", "checkbox");
  618.         menuItem.setAttribute("label", O._sb.GetStringFromName("ShowInUrlbar"));
  619.         menuItem.setAttribute("accesskey", "O");
  620.         menuItem.setAttribute("command", "cmd_toggleOmnibarIcon");
  621.         var popup = event.target;
  622.         var separator = popup.getElementsByTagName("menuseparator")[0];
  623.         popup.insertBefore(menuItem, separator);
  624.       }
  625.       O._toolbarPopupItem.setAttribute("checked", O._prefs.getBoolPref("showinurlbar"));
  626.     }catch(e){log(e);}
  627.   },
  628.   toggleOmnibarDisplay: function() {
  629.     var prefs = O._prefs;
  630.     prefs.setBoolPref("showinurlbar", !prefs.getBoolPref("showinurlbar"));
  631.   }
  632. };
  633.  
  634. window.addEventListener(
  635.   "load",
  636.   function () {
  637.     try {
  638.       O._init();
  639.     } catch (e) {
  640.       log(e);
  641.     }
  642.     setTimeout(function() {
  643.       // another call to check setup
  644.       O._recheck();
  645.     }, 200);
  646.     window.removeEventListener('load', arguments.callee, false);
  647.   },
  648.   false
  649. );
  650. })();
  651.